package com.campus.counseling.scoring;

import com.campus.counseling.entity.TestDimension;
import com.campus.counseling.service.TestDimensionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 总分评分器
 * 实现SDS抑郁自评量表标准计算方法
 */
@Slf4j
@Component("totalScorer")
@RequiredArgsConstructor
public class TotalScorer implements ScoringEngine {

    private final TestDimensionService testDimensionService;
    private final DimensionScorer dimensionScorer;

    @Override
    public Map<String, Double> calculateDimensionScores(Long testId, Map<Long, String> answers) {
        log.info("开始计算维度得分，testId: {}", testId);
        // 首先获取维度得分
        Map<String, Double> dimensionScores = dimensionScorer.calculateDimensionScores(testId, answers);
        log.info("原始维度得分: {}", dimensionScores);
        
        // 获取维度权重信息
        List<TestDimension> dimensions = testDimensionService.getDimensionsByTestId(testId);
        log.info("获取到维度数量: {}", dimensions.size());
        
        Map<String, Double> weightedScores = new HashMap<>();
        
        // 计算加权得分
        dimensions.forEach(dimension -> {
            Double score = dimensionScores.get(dimension.getDimensionKey());
            if (score != null) {
                Double weight = dimension.getWeight();
                Double weightedScore = score * (weight != null ? weight : 1.0);
                log.info("维度 {} 原始分数: {}, 权重: {}, 加权分数: {}", 
                    dimension.getDimensionKey(), score, weight, weightedScore);
                weightedScores.put(dimension.getDimensionKey(), weightedScore);
            } else {
                log.warn("维度 {} 未找到得分", dimension.getDimensionKey());
            }
        });
        
        log.info("加权后的维度得分: {}", weightedScores);
        return weightedScores;
    }

    @Override
    public Double calculateTotalScore(Map<String, Double> dimensionScores) {
        log.info("开始计算总分, 维度得分: {}", dimensionScores);
        
        if (dimensionScores == null || dimensionScores.isEmpty()) {
            log.warn("维度得分为空，返回0分");
            return 0.0;
        }

        // 计算原始总分（所有维度得分之和）
        double rawScore = dimensionScores.values().stream()
                .mapToDouble(Double::doubleValue)
                .sum();
                
        log.info("原始总分: {}", rawScore);
        
        // 计算标准分（原始分 × 1.25）
        double standardScore = rawScore * 1.25;
        log.info("标准分(原始分 * 1.25): {}", standardScore);
        
        return standardScore;
    }

    /**
     * 根据总分获取评估等级
     * @param totalScore 总分
     * @return 评估等级和建议
     */
    public Map<String, String> getAssessmentResult(double totalScore) {
        Map<String, String> result = new HashMap<>();
        
        if (totalScore < 53) {
            result.put("level", "正常");
            result.put("analysis", "您的心理状态处于正常范围，建议继续保持积极乐观的生活态度。");
            result.put("suggestions", "1. 保持规律的作息时间\n2. 适当运动和户外活动\n3. 与家人朋友保持良好沟通");
        } else if (totalScore < 63) {
            result.put("level", "轻度抑郁");
            result.put("analysis", "您可能存在轻度抑郁倾向，建议适当关注自己的心理状态。");
            result.put("suggestions", "1. 增加运动和户外活动时间\n2. 尝试放松和冥想练习\n3. 与信任的人分享感受\n4. 建议咨询心理专家获取专业建议");
        } else if (totalScore < 73) {
            result.put("level", "中度抑郁");
            result.put("analysis", "您可能存在中度抑郁症状，建议及时寻求专业帮助。");
            result.put("suggestions", "1. 尽快预约心理咨询\n2. 保持规律作息，避免熬夜\n3. 每天进行适度运动\n4. 与家人朋友保持紧密联系\n5. 避免做重要决定");
        } else {
            result.put("level", "重度抑郁");
            result.put("analysis", "您可能存在重度抑郁症状，强烈建议立即寻求专业帮助。");
            result.put("suggestions", "1. 立即预约心理医生或精神科医生\n2. 告知家人或信任的朋友，寻求支持\n3. 保持规律生活作息\n4. 避免独处\n5. 远离可能造成伤害的物品");
        }
        
        return result;
    }

    @Override
    public String getScoringType() {
        return "TOTAL";
    }

    @Override
    public boolean validateAnswer(String answer) {
        try {
            int num = Integer.parseInt(answer);
            return num >= 1 && num <= 4;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    /**
     * 获取理论最高分
     * @param dimensionCount 维度数量
     * @return 最高可能分数
     */
    private Double getMaxPossibleScore(int dimensionCount) {
        // 假设每个维度的最高分是5分（对应量表题的最高分值）
        return (double) (dimensionCount * 5);
    }
} 